package nio.demo;

import java.nio.ByteBuffer;
import java.nio.channels.Pipe;

/**
 * @Desc:   Java NIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。
 *          数据会被写到sink通道，从source通道读取
 * @author: cww
 * @DateTime: 2020-02-04 11:02
 */

public class PipeDemo {
    public static void main(String[] args) throws Exception {
        // 创建一个 pipe 通道
        Pipe pipe = Pipe.open();
        /*----------向通道写数据------------------*/
        // 要向管道写数据，就需要先访问 Pipe 中的 SinkChannel 通道
        Pipe.SinkChannel sinkChannel = pipe.sink();

        String newData = "New String to write to file..." + System.currentTimeMillis();
        ByteBuffer buf = ByteBuffer.allocate(48);
        buf.clear();
        buf.put(newData.getBytes());
        buf.flip();
        // 再通过 write 将数据写入 SinkChannel
        while(buf.hasRemaining()) {
            sinkChannel.write(buf);
        }
        /*------------------END-------------------*/

        /*-------------从管道读取数据---------------*/
        // 先访问 source 通道
        Pipe.SourceChannel sourceChannel = pipe.source();
        // 再调用 source 通道的 read() 方法来读取数据

        ByteBuffer readBuf = ByteBuffer.allocate(48);
        // read()方法返回的int值会告诉我们多少字节被读进了缓冲区
        int bytesRead = sourceChannel.read(readBuf);
        /*------------------END-------------------*/
    }
}



























